package com.kaithan.framework.common.util;

import com.kaithan.framework.common.context.SpringContext;
import com.kaithan.framework.common.enums.BaseEnums.Envs;
import org.springframework.core.env.Environment;

/**
 * 类描述：用于判断环境的工具类
 * 预置环境有 local、dev、test、uat、prod
 * 使用静态变量和懒加载机制来确保 EnvUtil 的正确初始化
 * @author ZhuYin
 * @since 2025年02月20日
 */
public class EnvUtil {

    /**
     * 默认环境标识，根据 nacos 配置加载的 namespace 来区分环境
     */
    private static final String DEFAULT_ENV_FLAG = "spring.cloud.nacos.config.namespace";

    private static volatile Environment environment;

    private static synchronized Environment getEnvironment() {
        if (environment == null) {
            environment = SpringContext.getBean(Environment.class);
        }
        return environment;
    }

    /**
     * 获取当前环境
     *
     * @return 当前环境的枚举值，如果未找到则返回 null
     */
    public static Envs getCurrentEnv() {
        // 使用 spring.cloud.nacos.config.namespace 来区分环境
        return getCurrentEnv(DEFAULT_ENV_FLAG);
    }

    /**
     * 方法说明：根据环境标识来获取当前环境
     *
     * @param envFlag 环境标识，nacos或者配置文件中可以配置特定的环境标识用来区分环境，默认为 spring.cloud.nacos.config.namespace
     * @return 类描述：环境枚举类
     * @author ZhuYin
     * @since 2025年02月20日
     */
    public static Envs getCurrentEnv(String envFlag) {
        if (StringUtils.isBlank(envFlag)) {
            envFlag = DEFAULT_ENV_FLAG;
        }
        String namespace = getEnvironment().getProperty(envFlag);
        return Envs.fromNamespace(namespace);
    }

    /**
     * 判断当前环境是否为指定环境
     *
     * @param targetEnv 目标环境
     * @return 是否匹配
     */
    public boolean isCurrentEnv(Envs targetEnv) {
        Envs currentEnv = getCurrentEnv();
        return currentEnv != null && currentEnv.equals(targetEnv);
    }

    /**
     * 判断当前环境是否为开发环境
     *
     * @return 是否为开发环境
     */
    public boolean isDevEnv() {
        return isCurrentEnv(Envs.dev);
    }

    /**
     * 判断当前环境是否为生产环境
     *
     * @return 是否为生产环境
     */
    public boolean isProdEnv() {
        return isCurrentEnv(Envs.prod);
    }

    /**
     * 判断当前环境是否为测试环境
     *
     * @return 是否为测试环境
     */
    public boolean isTestEnv() {
        return isCurrentEnv(Envs.test);
    }

    /**
     * 判断当前环境是否为用户验收测试环境
     *
     * @return 是否为用户验收测试环境
     */
    public boolean isUatEnv() {
        return isCurrentEnv(Envs.uat);
    }

    /**
     * 判断当前环境是否为本地环境
     *
     * @return 是否为本地环境
     */
    public boolean isLocalEnv() {
        return isCurrentEnv(Envs.local);
    }
}